package com.matrix.order.domain.repository;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.matrix.common.enums.OrderStatusEnum;
import com.matrix.order.domain.model.Order;

import java.util.List;
import java.util.Map;
import java.util.Optional;

/**
 * @author 有点甜
 * @since 2025/8/2
 */
public interface OrderRepository {

    /**
     * 通过ID查找订单聚合
     *
     * @param orderId 订单ID
     * @return Optional<Order>
     */
    Optional<Order> findById(Long orderId);

    /**
     * 通过订单号查找订单聚合
     *
     * @param orderNo 订单号
     * @return Optional<Order>
     */
    Optional<Order> findByOrderNo(String orderNo);

    /**
     * 通过支付号查找订单聚合
     *
     * @param paymentNo 支付号
     * @return Order
     */
    Order findByPaymentNo(String paymentNo);

    /**
     * 通过订单项ID查找其所属的订单聚合
     *
     * @param orderItemId 订单项ID
     * @return Optional<Order>
     */
    Optional<Order> findByOrderItemId(Long orderItemId);

    /**
     * 保存订单聚合
     *
     * @param order 订单聚合根
     */
    void save(Order order);

    /**
     * 分页查询商家的订单
     *
     * @param shopId   店铺ID
     * @param status   状态 (可为null)
     * @param pageNum  页码
     * @param pageSize 每页大小
     * @return Page<Order>
     */
    Page<Order> findPageByShopId(Long shopId, Integer status, int pageNum, int pageSize);

    /**
     * 分页查询用户的订单
     *
     * @param userId   用户ID
     * @param statuses 状态列表
     * @param pageNum  页码
     * @param pageSize 每页大小
     * @return Page<Order>
     */
    Page<Order> findPageByUserId(Long userId, List<OrderStatusEnum> statuses, int pageNum, int pageSize);

    /**
     * 获取店铺月销量
     *
     * @param shopIds 店铺ID列表
     * @return Map<Long, Integer>
     */
    Map<Long, Integer> getMonthlySalesByShopIds(List<Long> shopIds);

    /**
     * 获取菜品月销量
     *
     * @return Map<Long, Integer>
     */
    Map<Long, Integer> getProductMonthlySales();
}
